package server.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import model.Usuario;
import server.exception.DAOException;
import server.exception.ServiceException;
import server.model.Invitacion;

public class InvitacionesDAO{	
	private static Connection conexion;
	
	public InvitacionesDAO(){
		if(InvitacionesDAO.conexion == null)
			InvitacionesDAO.conexion = ConexionDAO.getInstance();
	}

	/**
	 * Obtiene una invitacion identificada por el id pasado por parametro
	 * 
	 * @param id
	 *            Identificacion de invitacion
	 * @return Invitacion identificada por ID, null en caso de no haber
	 *         coincidencias
	 * @throws ServiceException
	 *             En caso de no poder completarse la accion
	 */
	public List<Invitacion> obtener(int id) throws DAOException {
		return null;
	}
	

	/**
	 * Obtiene una lista con todas las invitaciones pendientes
	 * 
	 * @return Lista de invitaciones pendientes
	 * @throws ServiceException
	 *             En caso de no poder completarse la accion
	 */
	public List<Invitacion> todos() throws DAOException {
		return null;
	}

	/**
	 * Obtiene una lista de invitaciones destinadas al usuario pasado por
	 * parametro
	 * 
	 * @param usuario
	 *            Usuario del que se quiere saber sus invitaciones
	 * @return Lista de invitaciones pendientes para el usuario
	 * @throws ServiceException
	 *             En caso de no poder completarse la accion
	 */
	public List<Invitacion> invitacionesPara(Usuario usuario)
			throws DAOException {
		List<Invitacion> listaInvitaciones = new ArrayList<Invitacion>();
		try{
			Statement st = conexion.createStatement();
			String sql = "SELECT u.* " +
						 "FROM USUARIOS u, REPOSITORIO r " + 
						 "WHERE r.id_origen = u.id " +
						 "AND   r.id_destino = " + usuario.getId() + " ;";
			
			ResultSet rs = st.executeQuery(sql);
			Usuario invitado = usuario;
			
			
			while(rs.next()){	
				Usuario invitador = new Usuario();
				Invitacion i = new Invitacion();
				invitador.setNick(rs.getString("nick"));
				invitador.setNombre(rs.getString("nombre"));
				invitador.setApellido(rs.getString("apellido"));
				invitador.setId(rs.getInt("id"));
				i.setInvitador(invitador);
				i.setInvitado(invitado);
				listaInvitaciones.add(i);
			}
		}catch(SQLException e){
			throw new DAOException("No se pudo realizar la accion", e);
		}
		return listaInvitaciones;
}

	/**
	 * Obtiene una lista de invitaciones realizadas por determinado usuario
	 * 
	 * @param usuario
	 *            Usuario que realizo las invitaciones
	 * @return Lista de invitaciones realizadas por el usuario
	 * @throws ServiceException
	 *             En caso de no poder completarse la accion
	 */
	public List<Invitacion> invitacionesDe(Usuario usuario)
			throws DAOException {
		List<Invitacion> listaInvitaciones = new ArrayList<Invitacion>();
		try{
			Statement st = conexion.createStatement();
			String sql = "select usuario"+
						"from USUARIO as u "+
						"JOIN repositorio as r " + 
						"ON r.id_destino = u.id " +
						"where r.id_origen = " + usuario.getId() + ";";
			
			ResultSet rs = st.executeQuery(sql);
			Usuario invitado = usuario;
			Usuario invitador = new Usuario();
			
			while(rs.next()){			
			Invitacion i = new Invitacion();
			invitador.setNick(rs.getString("usuario"));
			invitador.setNombre(rs.getString("nombre"));
			invitador.setApellido(rs.getString("apellido"));
			i.setInvitador(invitador);
			i.setInvitado(invitado);
			listaInvitaciones.add(i);
			}
		}catch(SQLException e){
			throw new DAOException("No se pudo realizar la accion", e);
		}
		return listaInvitaciones;
	}

	/**
	 * Se acepta la invitacion pasada por parametro
	 * 
	 * @param invitacion
	 *            Invitacion aceptada
	 * @return true en caso de realizarse la accion, falso en caso contrario
	 * @throws ServiceException
	 *             En caso de no poder completarse la accion
	 */
	public boolean aceptar(Invitacion invitacion) throws DAOException {
		//Exito sirve para ver si se pudo realizar correctamente la accion
		@SuppressWarnings("unused")
		boolean exito = false;
		try{
			String sql = "INSERT INTO AMISTAD (id_user, id_amigo)" + 
						"values(?,?);";
			PreparedStatement pst= conexion.prepareStatement(sql);
			pst.setInt(1, invitacion.getInvitado().getId());
			pst.setInt(2, invitacion.getInvitador().getId());
			pst.executeUpdate();
			Statement st = conexion.createStatement();
			String delete = "DELETE " + "REPOSITORIO " + 
							"WHERE id_origen = " + invitacion.getInvitador().getId() +
							" AND id_destino = " + invitacion.getInvitado().getId(); 
			st.executeQuery(delete);
			conexion.commit();
			exito = true;
			return true;
		}catch(SQLException e){
			throw new DAOException("no se pudo realizar la accion",e);
		}
		
	}

	/**
	 * Rechaza una invitacion
	 * 
	 * @param invitacion
	 *            Invitacion a rechazar
	 * @return true en caso de exito, false en caso contrario
	 * @throws ServiceException
	 *             En caso de no poder completar la accion
	 */
	public boolean rechazar(Invitacion invitacion) throws DAOException {
		//Exito sirve para ver si se pudo realizar correctamente la accion
		@SuppressWarnings("unused")
		boolean exito = false;
		try{
			Statement st = conexion.createStatement();
			String delete = "DELETE " + "REPOSITORIO " + 
							"WHERE id_origen = " + invitacion.getInvitador().getId() +
							" AND id_destino = " + invitacion.getInvitado().getId(); 
			st.executeQuery(delete);
			conexion.commit();
			exito = true;
	}catch(SQLException e){
		throw new DAOException("no se puedo realizar la accion", e);
	}
		if(exito = true)
			return true;
		return false;
	}

	@SuppressWarnings("unused")
	public static void main(String[] args) throws SQLException{
		InvitacionesDAO a = new InvitacionesDAO();
		Usuario invitado = new Usuario();
		invitado.setId(9);
		Usuario invitador = new Usuario();
		invitador.setId(3);
		
		String sql = "SELECT u.* " +
					 "FROM USUARIOS u, REPOSITORIO r " + 
					 "WHERE r.id_origen = u.id " +
					 "AND   r.id_destino = " + invitado.getId() + " ;";
		Statement st = conexion.createStatement();		
		ResultSet rs = st.executeQuery(sql);
		
		while(rs.next()){			
			Invitacion i = new Invitacion();
			invitador.setNick(rs.getString("NICK"));
			System.out.println(invitador.toString());
		}
	}

}
